#include<stdio.h>
#include<string.h>

int n,add2,add3;
int one,two,thr;
int on[11],tw[11],th[11];
int vis[10];

void quick_sort(int l,int r)
{
	if(l>=r)
	{
		return;
	}
	int i=l-1,j=r+1,k=on[(l+r)/2];
	while(i<j)
	{
		do
		{
			i++;
		}while(on[i]<k);
		do
		{
			j--;
		}while(on[j]>k);
		if(i<j)
		{
			int t=on[i];
			on[i]=on[j];
			on[j]=t;
			t=tw[i];
			tw[i]=tw[j];
			tw[j]=t;
			t=th[i];
			th[i]=th[j];
			th[j]=t;
		}
	}
	quick_sort(l,j);
	quick_sort(j+1,r);
}

void dfs(int u)
{
	if(u>100)
	{
		on[n]=one;
		tw[n]=two;
		th[n]=thr;
		n++;
		//printf("%d %d %d\n",one,two,thr);
		return;
	}
	for(int i=1;i<10;i++)
	{
		if(!vis[i])
		{
			one+=i*u;
			vis[i]=1;
			if(!vis[i*2%10+add2])
			{
				int t2=add2;
				two+=(i*2%10)*u+add2*u;
				vis[i*2%10+add2]=1;
				add2=0;
				if(i*2>10)
				{
					add2=1;
				}
				if(!vis[i*3%10+add3])
				{
					int t3=add3;
					thr+=(i*3%10)*u+add3*u;
					vis[i*3%10+add3]=1;
					add3=0;
					if(i*3>10&&i*3<20)
					{
						add3=1;
					}
					else if(i*3>20)
					{
						add3=2;
					}
					dfs(u*10);
					one-=i*u;
					vis[i]=0;
					two-=(i*2%10)*u+t2*u;
					vis[i*2%10+t2]=0;
					if(i*2>10)
					{
						add2=t2;
					}
					thr-=(i*3%10)*u+t3*u;
					vis[i*3%10+t3]=0;
					if(i*3>10)
					{
						add3=t3;
					}
				}
				else
				{
					one-=i*u;
					vis[i]=0;
					two-=(i*2%10)*u+t2*u;
					vis[i*2%10+t2]=0;
					if(i*2>10)
					{
						add2=t2;
					}
				}
			}
			else
			{
				one-=i*u;
				vis[i]=0;
			}
		}
	}
}

int main()
{
	vis[0]=1;
	dfs(1);
	quick_sort(0,n-1);
	for(int i=0;i<n;i++)
	{
		printf("%d %d %d\n",on[i],tw[i],th[i]);
	}
	return 0;
}
